#include<bits/stdc++.h>
using namespace std;
const int MAXN=70,MAXL=110,MOD=10007;
int n,m,f[MAXL][MAXN*MAXL],ans,cnt;
char a[MAXL],len;
struct point
{
	int c[26],fail;
	bool count;
}p[MAXN*MAXL];
void insert()
{
	int u=0;
	for(int i=0;i<len;++i)
	{
		int k=a[i]-'A';
		if(!p[u].c[k])p[u].c[k]=++cnt;
		u=p[u].c[k];
		if(i==len-1)p[u].count=true;
	}
	return;
}
void cal_fail()
{
	queue<int>q;
	while(!q.empty())q.pop();
	q.push(0);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<26;++i)
		{
			if(!p[u].c[i])p[u].c[i]=p[p[u].fail].c[i];
			else
			{
				int k=p[u].fail;
				while(k&&!p[k].c[i])k=p[k].fail;
				if(u!=k)p[p[u].c[i]].fail=p[k].c[i];
				q.push(p[u].c[i]);
			}
		}
		p[u].count|=p[p[u].fail].count;
	}
	return;
}
void dp()
{
	f[0][0]=1;
	for(int i=1;i<=m;++i)
		for(int j=0;j<=cnt;++j)
		{
			if(p[j].count)continue;
			for(int k=0;k<26;++k)
				f[i][p[j].c[k]]=(f[i][p[j].c[k]]+f[i-1][j])%MOD;
		}
	for(int i=0;i<=cnt;++i)if(!p[i].count)ans=(ans+f[m][i])%MOD;
}
int qpow(int a,int b)
{
	int ans=1;
	for(;b;b>>=1,a=a*a%MOD)
		if(b&1)ans=ans*a%MOD;
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	{
		scanf("%s",a);
		len=strlen(a);
		insert();
	}
	cal_fail();
	dp();
	printf("%d\n",((qpow(26,m)-ans)%MOD+MOD)%MOD);
	return 0;
}
